package cn.iocoder.yudao.module.book.service.classes;

import java.util.*;
import javax.validation.*;
import cn.iocoder.yudao.module.book.controller.admin.classes.vo.*;
import cn.iocoder.yudao.module.book.controller.app.classes.vo.AppClassDetailRespVO;
import cn.iocoder.yudao.module.book.controller.app.classes.vo.AppClassesRespVO;
import cn.iocoder.yudao.module.book.controller.app.classes.vo.AppClassesSaveReqVO;
import cn.iocoder.yudao.module.book.controller.app.lock.vo.AppCheckInEnhancedRespVO;
import cn.iocoder.yudao.module.book.controller.app.classes.vo.BanjiManageReqVO;
import cn.iocoder.yudao.module.book.controller.app.classes.vo.AppClassMemberRespVO;
import cn.iocoder.yudao.module.book.dal.dataobject.classes.ClassesDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;

/**
 * 班级 Service 接口
 *
 * @author xi
 */
public interface ClassesService {

    /**
     * 创建班级
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Integer createClasses(@Valid ClassesSaveReqVO createReqVO);

    /**
     * 更新班级
     *
     * @param updateReqVO 更新信息
     */
    void updateClasses(@Valid ClassesSaveReqVO updateReqVO);

    /**
     * 删除班级
     *
     * @param id 编号
     */
    void deleteClasses(Integer id);

    /**
     * 获得班级
     *
     * @param id 编号
     * @return 班级
     */
    ClassesDO getClasses(Integer id);

    /**
     * 获得班级分页
     *
     * @param pageReqVO 分页查询
     * @return 班级分页
     */
    PageResult<ClassesDO> getClassesPage(ClassesPageReqVO pageReqVO);

    Integer InsertClasses(AppClassesSaveReqVO clas);

    ClassesDO selectClasses(Integer command);

    /**
     * 管理班级（转让、锁定、解散等）
     *
     * @param reqVO 管理请求
     * @param currentUserId 当前用户ID
     * @return 操作结果信息
     */
    String manageClass(BanjiManageReqVO reqVO, Long currentUserId);

    List<ClassesDO> getClassByUserId(Long currentUserId);

    Integer getCommand(Integer classesId);

    /**
     * 获取班级详情
     *
     * @param classId 班级ID
     * @param userId 当前用户ID
     * @return 班级详情
     */
    AppClassDetailRespVO getClassDetail(Integer classId, Long userId);

    /**
     * 获取用户的班级列表（包含创建的和加入的）
     *
     * @param userId 用户ID
     * @return 班级列表
     */
    List<AppClassesRespVO> getMyClasses(Long userId);

    /**
     * 加入班级（带重复检查）
     *
     * @param command 班级口令
     * @param userId 用户ID
     * @return 加入结果信息
     */
    String joinClass(Integer command, Long userId);

    /**
     * 检查用户是否已加入任何班级
     *
     * @param userId 用户ID
     * @return 是否已加入班级
     */
    boolean hasUserJoinedAnyClass(Long userId);

    /**
     * 根据班级口令预览班级信息
     *
     * @param command 班级口令
     * @return 班级信息（不包含敏感数据）
     */
    AppClassesRespVO previewClassByCommand(Integer command);

    /**
     * 获取班级的增强打卡记录列表
     */
    List<AppCheckInEnhancedRespVO> getClassCheckinsEnhanced(Integer classId, Long userId);

    /**
     * 学生退出班级
     *
     * @param command 班级口令
     * @param userId 用户ID
     * @return 退出结果信息
     */
    String quitClass(Integer command, Long userId);

    /**
     * 获取班级成员列表
     *
     * @param classId 班级ID
     * @param currentUserId 当前用户ID
     * @return 成员列表
     */
    List<AppClassMemberRespVO> getClassMembers(Integer classId, Long currentUserId);
}
